/*
 * Copyright 2011 Michael Nitsche
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

package de.mnit.schnipsel.swt.liste;


import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ControlEvent;
import org.eclipse.swt.events.ControlListener;
import org.eclipse.swt.events.KeyEvent;
import org.eclipse.swt.events.KeyListener;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;

import de.mnit.basis.daten.struktur.S_Folge;
import de.mnit.basis.daten.struktur.container.Engpass;
import de.mnit.basis.daten.struktur.gruppe.Gruppe3;
import de.mnit.basis.daten.struktur.liste.Liste;
import de.mnit.basis.daten.struktur.liste.S_Liste;
import de.mnit.basis.daten.struktur.tabelle.S_Tabelle;
import de.mnit.basis.fehler.Fehler;
import de.mnit.basis.fehler.system.F_Sys_Datei;
import de.mnit.basis.grafik.BildZugriff;
import de.mnit.basis.swt.anw.A_MN_Gruppe;
import de.mnit.basis.swt.dnd.A_DND_QuelleStd;
import de.mnit.basis.swt.dnd.DNDART;
import de.mnit.basis.swt.dnd.DNDTYP;
import de.mnit.basis.swt.dnd.transfer.IDObjekt;
import de.mnit.basis.swt.element.S_SWT_Komponente;
import de.mnit.basis.swt.element.menue.SWT_Menue_PopUp;
import de.mnit.basis.swt.element.steuer.A_SWT_Steuer;
import de.mnit.basis.swt.element.steuer.rollbar.gruppe.tabelle.SWT_TabelleVirtuell;
import de.mnit.basis.swt.grafik.Bild_SWT;
import de.mnit.basis.swt.grafik.S_Bild_SWT;
import de.mnit.basis.swt.grafik.icon.direkt.ICON;
import de.mnit.basis.swt.layout.LayoutMax;
import de.mnit.basis.sys.Ausgabe;
import de.mnit.basis.sys.datei.JarZugriff;
import de.mnit.basis.sys.event.S_Zuhoerer;
import de.mnit.schnipsel.db.B_Schnipsel;
import de.mnit.schnipsel.div.KonfigLokal;
import de.mnit.schnipsel.zentral.SC_Events;


/**
 * @author Michael Nitsche
 */
public class K_ListeEinfach extends A_MN_Gruppe<K_ListeEinfach> {

	public static void main(String[] args)   { start(K_ListeEinfach.class,600,400); }

	private static final String E_AUSWAHL="AUSWAHL";

	public static final int spalte_anzeige_datum=3;
	public static final int spalte_anzeige_klicks=2;
	public static final int spalte_db_id=4;
	public static final int spalte_db_klicks=5;
	public static final int spalte_db_crypt=6;
	public static final int spalte_db_geaendert=7;

	private int klicks_max=0;
	public SWT_TabelleVirtuell k_tabelle = new SWT_TabelleVirtuell().s1_Mehrfachauswahl();
	private final int spalte1Min=200;
	private Engpass<Integer> spalte2=Engpass.neu();
	private Engpass<Integer> spalte3=Engpass.neu();
	private int sort_spalte=1;
	private boolean sort_absteigend=false;
	private int sort_nach=1;


	public void speichernEnde() {
		KonfigLokal.i().anwListenSpalteKlicks(spalte2.g());
		KonfigLokal.i().anwListenSpalteDatum(spalte3.g());
	}

	public int gID1() {
		return Integer.parseInt(""+t.k_tabelle.gInhalt().gib(spalte_db_id, 1));
	}

	public S_Folge<Integer> gAuswahlIDs() {
		S_Folge<Object> auswahl=this.k_tabelle.gAuswahl().gSpalte(spalte_db_id);
		S_Liste<Integer> erg=Liste.neu();
		for(Object o : auswahl) {
			int id=Integer.parseInt(""+o);
			erg.plus(id);
		}
		return erg;
	}

	public int gLaenge() {
		return this.k_tabelle.gLaenge();
	}

	public void eAuswahl(S_Zuhoerer<Integer> z) {
		t.zuhoererPlus(E_AUSWAHL, z);
	}

	public void sAuswahlAlles() {
		t.k_tabelle.sAuswahlAlles();
	}

	public void sAuswahl(Integer id) {
		S_Liste<?> inhalt=t.k_tabelle.gInhalt().gSpalte(spalte_db_id);
		for(int i=0; i<inhalt.gLaenge(); i++) {
			Object id2=inhalt.gib(i+1);
			if(id==Integer.parseInt(""+id2)) {
				t.k_tabelle.swt().setSelection(i);
//				t.k_tabelle.swt().select(i);
				return;
			}
		}
	}

	public void spaltenAnpassen() {
		Table table=this.k_tabelle.swt();
		int breite=table.getClientArea().width;
		int scrollbarBreite = table.getVerticalBar().getSize().x;
		int neu=breite-2*table.getBorderWidth()-scrollbarBreite;
		TableColumn[] columns = table.getColumns();

		neu-= Math.min(spalte2.g(), columns[1].getWidth());
		neu-= Math.min(spalte3.g(), columns[2].getWidth());
		neu = Math.max(this.spalte1Min, neu);
		columns[0].setWidth(neu);
	}

	public void sInhalt(S_Tabelle<String> dberg, Engpass<Boolean> abbruch) {
		iKlicks(dberg);
		if(abbruch!=null && abbruch.g())
			return;
		this.k_tabelle.sInhalt(dberg);
		if(abbruch!=null && abbruch.g())
			return;
		this.k_tabelle.sortieren(sort_spalte, sort_absteigend, sort_nach);
	}

	// ERZEUGEN

	protected S_SWT_Komponente<?, ? extends Composite> layout() {
		return LayoutMax.neu(t.k_tabelle);
	}

	protected void initStyle() {
//		t.k_tabelle.sLetzteSpalteAuto(200);
		t.k_tabelle.bauen(true, false, "Titel", "Klicks", "Datum");
		spalte2.s(KonfigLokal.i().anwListenSpalteKlicks());
		spalte3.s(KonfigLokal.i().anwListenSpalteDatum());
		t.k_tabelle.gSpalte(2).sBreite(spalte2.g()); //  70
		t.k_tabelle.gSpalte(3).sBreite(spalte3.g()); // 130
		t.k_tabelle.gSpalte(spalte_anzeige_datum).sSortierbar(spalte_db_geaendert);
		t.k_tabelle.gSpalte(spalte_anzeige_klicks).sSortierbar(spalte_db_klicks);
		spaltenAnpassen();
	}

	protected void initEvents() {
		this.k_tabelle.gSpalte(1).eSortiert(new S_Zuhoerer<Boolean>() {
			public void verarbeite(Boolean b) {
				Ausgabe.debug(1,b,1);
				t.sort_spalte=1;
				t.sort_absteigend=b;
				t.sort_nach=1;
			}
		});
		this.k_tabelle.gSpalte(spalte_anzeige_klicks).eSortiert(new S_Zuhoerer<Boolean>() {
			public void verarbeite(Boolean b) {
				t.sort_spalte=spalte_anzeige_klicks;
				t.sort_absteigend=b;
				t.sort_nach=spalte_db_klicks;
			}
		});
		this.k_tabelle.gSpalte(spalte_anzeige_datum).eSortiert(new S_Zuhoerer<Boolean>() {
			public void verarbeite(Boolean b) {
				t.sort_spalte=spalte_anzeige_datum;
				t.sort_absteigend=b;
				t.sort_nach=spalte_db_geaendert;
				Ausgabe.debug(t.sort_spalte, t.sort_absteigend, t.sort_nach);
			}
		});

		this.k_tabelle.swt().addControlListener(new ControlListener(){
			private boolean single=false;
			public void controlMoved(ControlEvent e) {}
			public void controlResized(ControlEvent e) {
				if(single) { //BUGFIX: Bei column.setWidth wird ein Resized ausgelöst!
					single=false;
					return;
				}
				spaltenAnpassen();
				single=true;
			}
		});

		ControlListener spaltenMove=new ControlListener() {
			public void controlMoved(ControlEvent e) {}
			public void controlResized(ControlEvent e) {
				Table tab=t.k_tabelle.swt();
				Rectangle area = tab.getClientArea();
				Point vScrollBar = tab.getVerticalBar().getSize();
				int tabWidth = area.width - 2*tab.getBorderWidth() - vScrollBar.x;
				TableColumn[] columns = tab.getColumns();

				int w0=columns[0].getWidth();
				int w1=columns[1].getWidth();

				int w2soll=tabWidth-w0-w1;
				spalte2.s(w1);
				spalte3.s(w2soll);

				columns[2].setWidth(w2soll);
			}
		};

		this.k_tabelle.swt().getColumn(0).addControlListener(spaltenMove);
		this.k_tabelle.swt().getColumn(1).addControlListener(spaltenMove);

		SWT_Menue_PopUp menu=t.k_tabelle.nMenu_PopUp();
		menu.nMenueFeld("Neu", null, ICON._16.AKTION_PLUS).eAuswahl(new Listener() {
			public void handleEvent(Event e) {
//				iPlus(cursor.g());
				SC_Events.schnipselPlus();
			}
		});
		menu.nMenueFeld("Entfernen", null, ICON._16.AKTION_MINUS).eAuswahl(new Listener() {
			public void handleEvent(Event e) {
				SC_Events.schnipselMinus();
			}
		});

//		menu.eZeigen(new Listener() {
//			public void handleEvent(Event e) {
//				Point p=t.gDisplay().getCursorLocation();
//				cursor.s(p);
//				//TODO
//				feldNeu.sAktiv(true);
//				feldEntf.sAktiv(true);
//			}
//		});

		// Senden
		t.k_tabelle.eAuswahl(new Listener(){
			public void handleEvent(Event event) {
				S_Folge<Object> auswahl=t.k_tabelle.gAuswahl().gSpalte(spalte_db_id);
				Integer id=auswahl.gLaenge()>0 ? Integer.parseInt(""+auswahl.gib(1)) : null;
				t.zuhoererStart(E_AUSWAHL, id);
			}
		});

		t.k_tabelle.sDND_Quelle(new A_DND_QuelleStd(DNDART.LINK, DNDART.KOPIE, DNDTYP.TEXT, DNDTYP.MN_ID) {
			public Object uebergabe(DNDTYP typ, A_SWT_Steuer<?,?> e) {
				S_Tabelle<Object> auswahl=t.k_tabelle.gAuswahl();
				if(auswahl.gLaenge()==0)
					return null;
				if(typ==DNDTYP.TEXT) {
					StringBuilder sb=new StringBuilder();
					for(Object s : auswahl.gSpalte(1))
						sb.append(s+"\n");
					return sb.toString();
				}
				if(typ==DNDTYP.MN_ID) {
					S_Liste<IDObjekt> idos=Liste.neu();
					for(Object id : auswahl.gSpalte(spalte_db_id))
						idos.plus(new IDObjekt(B_Schnipsel.class, Integer.parseInt(""+id)));
					return idos.zuArray(IDObjekt.class);
				}
				return null;
			}
		});

		t.k_tabelle.eTaste(new KeyListener() {
			public void keyPressed(KeyEvent e) {
			}
			public void keyReleased(KeyEvent e) {
				if(e.keyCode==SWT.DEL)
					SC_Events.schnipselMinus();
//				if(e.stateMask==SWT.CTRL && e.keyCode=='a') //Geht schon, warum auch immer!
//					SC_Events.alleAuswaehlen();
			}
		});

		this.k_tabelle.eHoleFeldgroesse(new Listener(){
			public void handleEvent(Event event) {
				event.height = 18; //Unter Linux ok, keine Veränderung
			}
		});

		this.k_tabelle.eFeldZeichnen(spalte_anzeige_klicks, new S_Zuhoerer<Gruppe3<Event,Integer,Object[]>>(){
			private S_Bild_SWT img_k, img_s;
			private boolean init=false;
			public void verarbeite(Gruppe3<Event,Integer,Object[]> g) {
				if(!init) {
					try {
						img_k =Bild_SWT.neu(BildZugriff.gStream("balken2.png"));
						img_s =Bild_SWT.neu(JarZugriff.gJarStream("/jar/icon/schloss_zu.png"));
					}
					catch(F_Sys_Datei e)   { Fehler.zeig(e); }
					init=true;
				}

				int x=g.g1().x;
				int y=g.g1().y+(g.g1().height-16)/2;

				Object ocrypt=g.g3()[spalte_db_crypt-1];
				boolean crypt= Boolean.parseBoolean(""+ocrypt);

				Object oklicks=g.g3()[spalte_db_klicks-1];
				int klicks= oklicks==null ? 0 : Integer.parseInt(""+oklicks);

				if(klicks_max==0) klicks_max=1;
				int wert=(5*klicks)/klicks_max;

//				int breite=t.k_tabelle.swt().getBounds().width;
//				int breite=t.k_tabelle.gSpalte(1).gBreite();
//				x=breite-40-(x*2) -18; //(16+2 für Schloss)
				final GC gc=g.g1().gc;

				Rectangle ca=t.k_tabelle.swt().getClientArea();
				gc.setClipping(new Rectangle(Math.max(0, ca.x), Math.max(0,ca.y), ca.width, ca.height));

				//Hat zu Darstellungsfehlern geführt
//				gc.setForeground(FarbManager.gFarbe(255, 255, 255));
//				gc.fillRectangle(x, g.g1().y, g.g1().x+breite-x, g.g1().y+g.g1().height);

//				x=x+18;
				if(klicks>=1)	gc.drawImage(img_k.gImage(), x   , y);
				if(wert>=2)		gc.drawImage(img_k.gImage(), x+ 8, y);
				if(wert>=3)		gc.drawImage(img_k.gImage(), x+16, y);
				if(wert>=4)		gc.drawImage(img_k.gImage(), x+24, y);
				if(wert>=5)		gc.drawImage(img_k.gImage(), x+32, y);
				x+=40+5;

				if(crypt)
					gc.drawImage(img_s.gImage(), x   , y);

//				if(klicks==0)
//					return;
//				int w=40*klicks/klicks_max;
//				gc.setForeground(FarbManager.gFarbe(255,255,255));
//				gc.setBackground(FarbManager.gFarbe(0, 0, 255));
////				gc.fillRectangle(x, y, w, 16);
//				gc.fillGradientRectangle(x, y, w, 16, false);
			}
		});
	}

	// INTERN

	private void iKlicks(S_Tabelle<?> tab) {
		//Klicks Max berechnen
		this.klicks_max=0;
		for(Object o : tab.gSpalte(spalte_db_klicks))
			this.klicks_max=Math.max(this.klicks_max, Integer.parseInt(""+o));
	}

}
